package middleware.p2p;

import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;

import middleware.p2p.log.XmlSerializable;

/**	
 *	Classe contenente i dati per descrivere un task all'interno del middleware.
 *	Ogni task è identificato da un ID, un tipo, un comando ed un link al file da eseguire.
 *	@see TaskTYPE  
 */
@XmlRootElement(name="task")
@XmlType(propOrder={"type","command","link"})
public class TaskDescriptor implements XmlSerializable{	
	/**
	 * 	Campo necessario alla serializzazione
	 */
	private static final long serialVersionUID = 7443532829971213529L;
	/**	
	 * 	Identificativo del Task	
	 **/
	@XmlAttribute(name="id")
	private int ID;
	/**
	 * 	Tipologia del task.
	 */
	@XmlElement(name="type")
	private TaskTYPE type;
	/**
	 * 	Command di esecuzione del task.
	 */
	@XmlElement(name="command")
	private String command;
	/**
	 * 	Link al file da eseguire.
	 */
	@XmlElement(name="link")
	private String link;
	/**
	 * 	Costruttore principale della classe.
	 * 	@param	id 		ID del nuovo task
	 * 	@param 	type 	Tipologia del nuovo task.
	 * 	@param	command	Comando del nuovo task
	 * 	@param	link	Link al file da eseguire.
	 * 	@see TaskTYPE
	 */
	public TaskDescriptor(int id,TaskTYPE type, String command, String link) {
		this.ID=id;
		this.type=type;
		this.command=command;
		this.link=link;
	}
	/**
	 * 	Costruttore di default della classe.
	 * 	Costruisce un oggetto con ID -1,tipo eseguibile e le stringhe command e link vuote.
	 */
	public TaskDescriptor() {
		this(-1, TaskTYPE.Executable, "", "");
	}
	/**	
	 * 	Metodo per ottenere l'Identificativo del task.
	 * 	@return	ID del task.
	 */
	@XmlTransient
	public int getID() {
		return ID;		
	}
	/**
	 * 	Metodo per impostare l'identificativo del task.
	 * 	@param id	Identificativo da impostare per il task.
	 */
	public void setID(int id) {
		this.ID = id;
	}
	/**	
	 * 	Metodo per ottenere il tipo del task.
	 * 	@return La tipologia del task.
	 * 	@see TaskTYPE
	 */
	@XmlTransient
	public TaskTYPE getType() {
		return type;
	}
	/**	
	 * 	Metodo per impostare la tipologia del task.
	 * 	@param type Tipologia del task
	 * 	@see TaskTYPE
	 */
	public void setType(TaskTYPE type) {
		this.type = type;
	}
	/**	
	 * 	Metodo per ottenere il comando con cui &egrave; stato generato il task.
	 * 	@return Il command associato al task
	 */
	@XmlTransient
	public String getCommand() {
		return command;		
	}
	/**
	 * 	Metodo per impostare il comando con cui &egrave; stato generato il task.
	 * 	@param command Command da associare al task.
	 */
	public void setCommand(String command) {
		this.command = command;
	}
	/**
	 * 	Metodo per ottenere il link al file da eseguire.
	 * 	@return La string contenente il link al file.
	 */
	@XmlTransient
	public String getLink() {
		return link;
	}
	/**
	 * 	Metodo per impostare il link al file da eseguire
	 * 	@param link la stringa contenente il link al file.
	 */
	public void setLink(String link) {
		this.link = link;
	}
	public String toXmlString() {
		try {
			JAXBContext context= JAXBContext.newInstance(this.getClass());
			Marshaller marshaller=context.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);			
			StringWriter sw=new StringWriter();			
			marshaller.marshal(this, sw);
			return sw.toString();
		} catch (JAXBException jaxbe) {
			jaxbe.printStackTrace();
			return "";
		}		
	}	
}
